package com.qingke.bullfight;

import java.io.Serializable;
import java.util.Random;
import java.util.Scanner;
/**
 * 桌类
 * 牛牛的一切均发生在桌上
 * @author Administrator
 *
 */
public class Table implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -7791473527162007162L;
	
	public Dealer dealer=new Dealer();//一个荷官
	public Gamer[] gamers=new Gamer[10];//默认第一个玩家是自己，其他的为电脑玩家
	public int num=0;//玩家总数，包括自己
	private int theBanker=0;//庄家的索引
	/**
	 * 
	 */
	public Table(){
		
	}
	/**
	 * 随机加入一个玩家
	 */
	public void add(){
		if(num>10)
			System.out.println("人数已满，无法再添加玩家");
		else{
			Gamer gamer=new Gamer();
			for(int i=0;i<gamers.length;i++){
				if(gamers[i]==null){
					gamers[i]=gamer;
					break;
				}
			}
			num++;
		}
	}
	/**
	 * 加入一个指定的玩家
	 * @param gamer
	 */
	public void add(Gamer gamer){
		if(num>10)
			System.out.println("人数已满，["+gamer.getName()+"]无法加入游戏");
		else{
			for(int i=0;i<gamers.length;i++){
				if(gamers[i]==null){
					gamers[i]=gamer;
					break;
				}
			}
			num++;
		}
	}
	/**
	 * 移除一个玩家，移除顺序索引从小到大
	 */
	public void remove(){
		if(num==1)
			System.out.println("桌上就剩你了，快点召唤小伙伴吧");
		else{
			for(int i=1;i<gamers.length;i++){
				if(gamers[i]!=null){
					System.out.println("啊~~~好可怜，["+gamers[i].getName()+"]已被["+gamers[0].getName()+"]踢出桌子，5555555555");
					gamers[i]=null;
					break;
				}
			}
			num--;
		}
	}
	/**
	 * 找到筹码最多的玩家，并返回这个玩家
	 * @return
	 */
	public Gamer getMostChip(){
		int max=0;
		for(int i=0;i<gamers.length;i++){
			if(gamers[i]!=null){
				max=Math.max(max,gamers[i].getChip());
			}
		}
		for(int i=0;i<gamers.length;i++){
			if(gamers[i]!=null&&gamers[i].getChip()==max){
				return gamers[i];
			}
		}
		return null;
	}
	/**
	 * 设置庄家
	 */
	public void setBanker(){
		this.gamers[theBanker].setBanker(true);
	}
	/**
	 * 自动设置庄家（筹码最多的）
	 */
	public void autoSetBanker(){
		getMostChip().setBanker(true);
	}
	/**
	 * 列出所有玩家和他们筹码
	 */
	public void listGamers(){
		for(Gamer g:gamers){
			if(g!=null)
				System.out.println("["+g.getName()+"]筹码："+g.getChip());
		}
		System.out.println("");
	}
	/**
	 * 检测玩家的筹码
	 * 若是自己筹码不足，则提示充值
	 * 若电脑玩家不足，则直接踢出
	 */
	public void checkChip(){
		if(gamers[0].getChip()<=0){
			//一个类里两个地方用了Scanner就没法关闭其中一个了
			//关了一个另一个也不能用了，因为System.in被关闭，它是公用的
			@SuppressWarnings("resource")
			Scanner sc = new Scanner(System.in);
			System.out.println("["+gamers[0].getName()+"]需要充值筹码：");
			while(true){
				System.out.println("充值筹码：");
				int chip=sc.nextInt();
				if(chip>0){
					gamers[0].chargeChip(chip);
					break;
				}
			}
		}
		for(int i=1;i<gamers.length;i++){
			if(gamers[i]!=null&&gamers[i].getChip()<=0){
				System.out.println("["+gamers[i].getName()+"]无筹码，已退出。");
				gamers[i]=null;
			}
		}
	}
	/**
	 * 开始斗牛
	 * 人数不足直接return
	 * 斗牛流程
	 * ======
	 * 检测筹码
	 * 荷官洗牌
	 * 荷官发牌
	 * 玩家看牌
	 * 玩家下注（庄家不下注，而是接受其他玩家的注码）
	 * 开牌（显示各自手牌详细信息，5张牌，是否有牛，牛几，最大牌）
	 * 结算（胜者赢得筹码，负者失去筹码）
	 * 列出一局结束后玩家的筹码信息
	 * 
	 */
	public void start(){
		System.out.println("");
		autoSetBanker();
		if(num<2){
			System.out.println("人数不足，无法开始游戏");
			return ;
		}
		
		checkChip();
		shufflePart();
		dealPart();
		lookPart();
		betPart();
		flopPart();
		settlePart();
		listGamers();
		
	}
	/**
	 * 洗牌
	 * 调用荷官洗牌
	 */
	public void shufflePart(){
		dealer.shuffle();
		System.out.println("");
	}
	/**
	 * 发牌
	 * 调用荷官发牌
	 */
	public void dealPart(){
		for(int i=0,count=1;i<5;i++){
			for(int j=0;j<gamers.length;j++){
				if(gamers[j]!=null){
					System.out.print("【"+count+"】");
					count++;
					dealer.deal(gamers[j]);
				}
			}
		}
		System.out.println("");
	}
	/**
	 * 看牌
	 * 主角看牌，显示手牌5张牌，是否有牛，牛几，最大牌
	 */
	public void lookPart(){
		gamers[0].look();
		System.out.println("");
	}
	/**
	 * 下注
	 * 闲家下注
	 * 主角选择注码
	 * 电脑随机下注
	 */
	public void betPart(){
		@SuppressWarnings("resource")
		Scanner sc = new Scanner(System.in);
		Random r = new Random();
		
		if(!gamers[0].isBanker()){
			System.out.println("["+gamers[0].getName()+"]当前筹码："+gamers[0].getChip());
			do{
				System.out.println("请下注：");
				int wager=sc.nextInt();
				gamers[0].bet(wager);
			}while(!gamers[0].isBet());
		}
		System.out.println("");
		System.out.println("["+getMostChip().getName()+"]是庄家");
		
		for(int i=0;i<gamers.length;i++){
			if(gamers[i]!=null){
				if(!gamers[i].isBanker()&&!gamers[i].isBet()){
					do{
						gamers[i].bet(Math.min(r.nextInt(100)+(int)(gamers[i].getChip()*r.nextDouble()),gamers[i].getChip()));
					}while(!gamers[i].isBet());
				}
				
			}
		}
		
		System.out.println("");
	}
	/**
	 * 开牌
	 * 先显示庄家信息
	 * 再显示闲家信息
	 */
	public void flopPart(){
		System.out.println("庄家");
		for(int i=0;i<gamers.length;i++){
			if(gamers[i]!=null&&gamers[i].isBanker()){
				System.out.print(gamers[i].getName()+":");
				gamers[i].look();
				System.out.println("------------------------------------");
				break;
			}
		}
		System.out.println("闲家");
		for(int i=0;i<gamers.length;i++){
			if(gamers[i]!=null&&!gamers[i].isBanker()){
				System.out.print(gamers[i].getName()+":");
				gamers[i].look();
				System.out.println("------------------------------------");
			}
		}
		System.out.println("");
	}
	/**
	 * 结算
	 * 胜者赢得筹码，负者失去筹码
	 * 所有玩家初始化状态
	 */
	public void settlePart(){
		for(int i=0;i<gamers.length;i++){
			if(gamers[i]!=null&&gamers[i].isBanker()){
				for(int j=0;j<gamers.length;j++){
					if(gamers[j]!=null&&!gamers[j].isBanker()){
						try {
							Thread.sleep(300);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						if(gamers[i].getHand().compare(gamers[j].getHand())==Result.LOSE){
							System.out.println("["+gamers[j].getName()+"]赢庄家["+gamers[i].getName()+"]，"+"  +"+gamers[j].getWager());
							gamers[i].reduceChip(gamers[j].getWager());
							gamers[j].increseChip(gamers[j].getWager()*2);
							gamers[j].end();
						}
						else{
							System.out.println("["+gamers[j].getName()+"]输庄家["+gamers[i].getName()+"]，"+"  -"+gamers[j].getWager());
							gamers[i].increseChip(gamers[j].getWager());
							gamers[j].end();
						}
					}
				}
				gamers[i].end();
				break;
			}
		}
		System.out.println("");
	}
	
}
